﻿Imports System.Threading

Class Application

    ' Startup、Exit、DispatcherUnhandledException などのアプリケーション レベルのイベントは、
    ' このファイルで処理できます。
    Private Shared MyMutex As Mutex

    Private Sub Application_Exit(ByVal sender As Object, ByVal e As System.Windows.ExitEventArgs) Handles Me.Exit
        If MyMutex IsNot Nothing Then
            MyMutex.ReleaseMutex()
            MyMutex.Close()
        End If
    End Sub

    ' Startup、Exit、DispatcherUnhandledException などのアプリケーション レベルのイベントは、
    ' このファイルで処理できます。

    Private Sub Application_Startup(ByVal sender As Object, ByVal e As System.Windows.StartupEventArgs) Handles Me.Startup
        ' 名前を指定してMutexを生成 
        MyMutex = New Mutex(False, My.Resources.ApplicationName)

        ' 二重起動をチェック
        If Not MyMutex.WaitOne(0, False) Then

            MyMutex.Close()
            MyMutex = Nothing

            ' 同名のプロセスが他に存在する場合は、既に起動していると判断
            Dim current = System.Diagnostics.Process.GetCurrentProcess()
            Dim ps = System.Diagnostics.Process.GetProcessesByName(current.ProcessName)
            For Each p In ps
                If current.Id <> p.Id Then
                    ' TODO タスクトレイにはいっていたら無理
                    NativeMethods.ShowWindow(p.MainWindowHandle, NativeMethods.SW_SHOWNORMAL)
                    NativeMethods.SetForegroundWindow(p.MainWindowHandle)
                    Exit For
                End If
            Next

            Me.Shutdown()
        End If

    End Sub
End Class
